package com.imooc.mq;

import com.rabbitmq.client.*;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * 构建发布订阅模式的消费者，监听消费消息
 */
public class PubSubConsumerA {

    static String fanout_queue_a = "fanout_queue_a";

    public static void main(String[] args) throws IOException, TimeoutException {
        // 1. 创建连接工厂及相关参数 Factory
        ConnectionFactory connectionFactory = new ConnectionFactory();
        connectionFactory.setHost("localhost");
        connectionFactory.setPort(5672);
        connectionFactory.setVirtualHost("/");
        connectionFactory.setUsername("imooc");
        connectionFactory.setPassword("imooc");
        // 2. 通过工厂创建连接 Connection
        Connection connection = connectionFactory.newConnection();
        // 3. 创建管道 Channel
        Channel channel = connection.createChannel();
        // 4. 定义队列 (简单模式，不需要交换机Exchange)
        channel.queueDeclare(fanout_queue_a, true, false, false, null);


        Consumer consumer = new DefaultConsumer(channel) {

            /**
             * 重写消息配送方法
             * @param consumerTag 消息的标签（标识）
             * @param envelope 信封（一些信息，比如交换机路由等等信息）
             * @param properties 配置信息
             * @param body 收到的消息数据
             * @throws IOException
             */
            @Override
            public void handleDelivery(String consumerTag,
                                       Envelope envelope,
                                       AMQP.BasicProperties properties,
                                       byte[] body)
                    throws IOException {

                System.out.println("body: " + new String(body));
            }
        };


        /*
          (String queue, boolean autoAck, Consumer callback)
          queue: 监听的队列名
          autoAck: 是否自动确认，true： 告知mq消费者已经消费的确认通知
          callback: 回调函数，处理监听到的消息
         */
        channel.basicConsume(fanout_queue_a, true, consumer);

    }
}
